Skip to content

コアを netstandard2.0 と net8.0 のマルチターゲットにし、net8.0 では Span<T> を使う - #11

Merged
cssho merged 1 commit into
address-to-zipfrom
net8-span
Nov 5, 2026
Merged

cssho merged 1 commit into
address-to-zipfrom
net8-span

Conversation

@cssho

@cssho cssho commented Nov 5, 2026

Copy link
Copy Markdown
Owner

#10 の上に積んだ PR です。 #10 のマージ後に、ベースを master に変更してからマージしてください(#10 のマージ時にブランチが削除される設定なら、GitHub が自動でベースを master に変更します)。

概要

コアのターゲットを netstandard2.0 と net8.0 の 2 つにし、#if NET8_0_OR_GREATER で Span<T> を使う処理を切り替えました。あわせて、両方のビルドに効く改善も入れています。

変更内容

net8.0 版だけ(Span を使う)

  • 住所照合の正規化: 都道府県名・市区町村名を、文字列を作らずスタック上(stackalloc)で正規化して比べる。
  • CSV の読み込み: 行を区切り位置(Range)だけ求め、使う列だけを文字列にする。

両方のビルド共通

  • 住所の分割: 「都道府県 + 市区町村 + 町域」の候補文字列を最大 12 個つなげて作り、毎回正規化していたのをやめた。都道府県 → 市区町村 → 町域の順に部分ごとに照合し、町域名は正規化済みのものを使い回す。市区町村名は「市・区・町・村」で終わり漢数字で終わらないため、部分照合でも結果は変わらない。
  • 郵便番号のチェック: Select・string.Join・Replace・正規表現をやめ、1 回の走査で 7 桁を確かめるループにした(Span なしで十分なため #if は使っていない)。

#if は、AddressMatcher の 2 メソッド、BarCode.WriteKanjiNumber、CSV の列を扱う CsvFields 構造体、読み込みのループの中だけに閉じ込めました。漢数字の計算や 1 文字ごとの正規化は、両方のビルドで共通のメソッドを使っています。コアに System.Memory などの依存は追加していません。

計測結果(実データ、10 万件、1 件あたり)

処理 変更前 .NET Standard 2.0 版 net8.0 版
住所の分割 1.88μs / 3,760B 0.61μs / 1,442B 0.56μs / 886B
生成・辞書あり 4.86μs / 6,830B 3.45μs / 4,511B 3.42μs / 3,859B
生成・辞書なし 3.76μs / 3,354B 3.55μs / 3,242B 3.58μs / 3,146B
読み込み(全体) 約 250ms / 178MB 約 270ms / 180MB 約 225ms / 101MB
  • 住所の分割の改善の大部分は、両方のビルド共通の部分照合によるもの。Span の上乗せは、分割で約 550B、読み込みで約 80MB の割り当て削減。
  • 読み込み時間の差は測定のぶれの範囲。はっきり効果が出たのは割り当て量。
  • 住所→郵便番号の検索は今回の対象外で、変化は測定のぶれの範囲。

テスト

  • dotnet test(net8.0 版)と dotnet test -p:CoreTargetFramework=netstandard2.0 の両方で 238 件すべて成功。
  • 指定したコアのビルドが実際に使われているかを確かめるテスト(TargetFrameworkTests)を追加。
  • 実データでの精度は変更前と同じ(町域 99.2%、事業所 99.6%)。

正規化のループは StringBuilder 版と Span 版の 2 通りになったため、両方のビルドでのテストが欠かせません。この後の GitHub Actions で、両方を自動でテストするようにします。

🤖 Generated with Claude Code

https://claude.ai/code/session_01HNb8H3ydQTR8dWU8d28osE

- net8.0 では、住所照合の正規化をスタック上で行い、CSV の読み込みで使う列だけを文字列にする
- 住所の分割を都道府県名・市区町村名・町域名の順の照合に変え、候補文字列を作らないようにした(両方のビルド)
- 郵便番号のチェックを LINQ・正規表現を使わないループにした(両方のビルド)
- テストでコアのビルドを切り替えられるようにした(dotnet test -p:CoreTargetFramework=netstandard2.0)
- README と CLAUDE.md を更新

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HNb8H3ydQTR8dWU8d28osE
@cssho
cssho merged commit 8527aba into address-to-zip Nov 5, 2026
@cssho
cssho deleted the net8-span branch November 5, 2026 23:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant